﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.DistributedServices.PermisosModule.WindowsHost.ViewModelBase;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Domain.PermisosModule.Contracts.VariedadesGrupos;
using Cesave.Infrastructure.CrossCutting.IoC;
using System.Windows.Forms;

namespace Cesave.DistributedServices.PermisosModule.WindowsHost.ViewModels.Catalogs.Variedades
{
	public partial class VariedadesViewModel
		: ObservableObject
	{
		#region Private properties

		/// <summary>
		/// Grupos de variedades.
		/// </summary>
		private List<VariedadesGrupo> _grupos;

		/// <summary>
		/// Grupo seleccionado.
		/// </summary>
		private VariedadesGrupo _grupo;

		#endregion

		#region Public properties

		/// <summary>
		/// Grupos de variedades.
		/// </summary>
		public List<VariedadesGrupo> Grupos
		{
			get
			{
				return _grupos;
			}
			private set
			{
				_grupos = value;
				if (_grupos != null)
					RaisePropertyChanged("Grupos");
			}
		}

		/// <summary>
		/// Grupo seleccionado.
		/// </summary>
		public VariedadesGrupo Grupo
		{
			get
			{
				return _grupo;
			}
			private set
			{
				_grupo = value;
				if (_grupo != null)
					RaisePropertyChanged("Grupo");
			}
		}

		#endregion

		#region Private methods

		private void LoadGrupos()
		{
			StartWaiting();
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (sender, e) =>
				{
					IVariedadesGrupoService service = IoCFactory.Resolve<IVariedadesGrupoService>();
					e.Result = service.FindVariedadesGruposByCultivo(VariedadCultivo.CultivoGuid);
				};
				worker.RunWorkerCompleted += (sender, e) =>
				{
					EndWaiting();
					if (!e.Cancelled && e.Error == null)
						Grupos = e.Result as List<VariedadesGrupo>;
					else if (e.Error != null)
						ShowMessage(e.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				worker.RunWorkerAsync();
			}
		}

		#endregion

		#region Event methods

		private void SetCurrentGrupo(object sender, EventArgs e)
		{
			BindingSource bindingSource = sender as BindingSource;
			if (bindingSource != null && bindingSource.Current != null)
				Grupo = bindingSource.Current as VariedadesGrupo;
		}

		private void OnGruposPropertyChanged()
		{
			Grupos.Insert(0, new VariedadesGrupo
			{
				GrupoGuid = Guid.Empty,
				GrupoId = 0,
				Nombre = "NINGUNO",
			});
			_view.variedadesGruposBindingSource.DataSource = Grupos;
			_view.variedadesGruposBindingSource.CurrentChanged += SetCurrentGrupo;
			SetCurrentGrupo(_view.variedadesGruposBindingSource, new EventArgs());
		}

		private void OnGrupoPropertyChanged()
		{
			if (IsVariedadReady)
			{
				Variedad.GrupoGuid = Grupo.GrupoGuid;
				Variedad.GrupoId = Grupo.GrupoId;
			}
		}

		#endregion

	}
}
